// fetch.js
import {
	ref,
	reactive,
	watchEffect,
	toValue,
	onScopeDispose
} from 'vue'
import request from '../../src/axios/request.js'

export function useFetch(url, options = {}) {

	const data = ref(null)
	const error = ref(null)
	const isLoading = ref(false);

	// 请求控制器（用于取消请求）
	let abortController = null;

	// 默认配置
	const defaultOptions = {
		method: 'GET',
		immediate: true,
		params: null,
		data: null,
		headers: {},
		timeout: 300000, // 添加默认超时时间（30秒）
		...options
	};

	// 请求执行函数
	const execute = async (executeOptions = {}) => {
		let abortController = null; // 移到函数内部

		try {
			// 合并配置
			const mergedOptions = {
				...defaultOptions,
				...executeOptions
			};

			// 重置状态
			error.value = null;
			isLoading.value = true;

			// 处理 URL（支持响应式 URL）
			const finalUrl = toValue(url);

			// 创建 AbortController
			abortController = new AbortController();

			// 发送请求
			const response = await request({
				url: finalUrl,
				method: mergedOptions.method,
				params: mergedOptions.params,
				data: mergedOptions.data,
				headers: mergedOptions.headers,
				signal: abortController.signal,
				timeout: mergedOptions.timeout || 30000
			});

			// 修复：根据实际响应结构处理
			// 方案1：如果响应直接是数据
			if (response && response.code !== undefined) {
				// 如果响应有 code 字段
				if (response.code === 200 || response.code === 0) {
					data.value = response.data || response;
					return response.data || response;
				} else {
					throw new Error(response.message || `请求失败，错误码: ${response.code}`);
				}
			} else {
				// 如果响应就是数据本身
				data.value = response;
				return response;
			}

		} catch (err) {
			console.log('请求错误:', err);

			// 处理取消请求的错误
			if (err.name === 'AbortError') {
				error.value = '请求已取消';
			} else if (err.response) {
				// axios 响应错误
				const status = err.response.status;
				const message = err.response.data?.message || err.message;

				switch (status) {
					case 400:
						error.value = '请求参数错误';
						break;
					case 401:
						error.value = '未授权，请重新登录';
						break;
					case 403:
						error.value = '拒绝访问';
						break;
					case 404:
						error.value = '请求地址不存在';
						break;
					case 500:
						error.value = '服务器内部错误';
						break;
					case 502:
						error.value = '网关错误';
						break;
					case 503:
						error.value = '服务不可用';
						break;
					case 504:
						error.value = '网关超时';
						break;
					default:
						error.value = message || `请求失败 (${status})`;
				}
			} else if (err.request) {
				// 请求发送失败
				error.value = '网络错误，请检查网络连接';
			} else {
				// 其他错误
				error.value = err.message || '请求失败';
			}

			return null;
		} finally {
			isLoading.value = false;
			abortController = null;
		}
	};

	// 组件卸载时自动取消请求
	onScopeDispose(() => {
		if (abortController) {
			abortController.abort();
		}
	});

	// 立即执行（如果需要）
	if (defaultOptions.immediate) {
		execute();
	}

	return {
		data,
		error,
		isLoading,
		execute
	}
}